/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package co.edu.distribuidos.interfaz;

import co.edu.distribuidos.mundo.AdministradorArchivos;
import co.edu.distribuidos.mundo.Archivo;
import java.awt.BorderLayout;
import java.io.File;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;

/**
 *
 * @author alvar-go@uniandes.edu.co
 */
public class InterfazSistemaDocs extends JFrame{

    private JTabbedPane opciones;

    private PanelCompartidos panelCompartidos;

    private PanelBusqueda panelBusqueda;

    private PanelDescargas panelDescarga;

    private AdministradorArchivos administrador;

    public InterfazSistemaDocs(AdministradorArchivos admin){
        setSize(950, 500);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLayout(new BorderLayout());
        setTitle("Sistema documentos P2P");

        opciones = new JTabbedPane();

        panelCompartidos = new PanelCompartidos(this);
        opciones.addTab("Compartidos", panelCompartidos);

        panelBusqueda = new PanelBusqueda(this);
        opciones.addTab("Busqueda", panelBusqueda);

        panelDescarga = new PanelDescargas();
        opciones.addTab("Descargas", panelDescarga);
        
        add(opciones, BorderLayout.CENTER);

        administrador = admin;
        actualizarArbol();
       
        setLocationRelativeTo(null);
    }

    @Override
    public void dispose(){
        try {
            administrador.guardar();
            administrador.detenerJXTA();
            super.dispose();
        } catch (Exception e) {
            e.printStackTrace();
            int respuesta = JOptionPane.showConfirmDialog(null, e.getMessage() + "\n ¿Desea cerrar la aplicación?", "Error", JOptionPane.YES_OPTION);
            if(respuesta == JOptionPane.YES_OPTION){
                super.dispose();
            }
        }
    }

    public static void main(String[] args){
        try {
            AdministradorArchivos admin = new AdministradorArchivos();
            InterfazSistemaDocs interfaz =new InterfazSistemaDocs(admin);
            interfaz.setVisible(true);
            admin.iniciarJXTA();
        } catch (Exception ex) {
           JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
       
    }

    public void compartir() {
        JFileChooser fc = new JFileChooser( );
        fc.setDialogTitle( "Buscar archivo" );
        fc.setMultiSelectionEnabled( false );
        int resultado = fc.showOpenDialog( this );
        if( resultado == JFileChooser.APPROVE_OPTION ){
            File archivo = fc.getSelectedFile();
            String claves = JOptionPane.showInputDialog(this, "Ingrese las palabras clave separadas por coma (,)");
            try {
                administrador.compartirArchivo(archivo, darPalabras(claves));
                actualizarArbol();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(this, e, "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private ArrayList<String> darPalabras(String linea){
        ArrayList<String> palabras = new ArrayList<String>();
        if(linea != null && !linea.trim().equals("")){
            String[] partes = linea.split(",");
            for( int  i = 0; i < partes.length; i++){
                palabras.add(partes[i].trim());
            }
        }
        return palabras;
    }

    private void actualizarArbol() {
        String[] tipos = new String[3];
        ArrayList<ArrayList<Archivo>> archivos = new  ArrayList<ArrayList<Archivo>>();
        tipos[0] = AdministradorArchivos.TEXTO;
        archivos.add(administrador.darArchivos(tipos[0]));

        tipos[1] = AdministradorArchivos.IMAGEN;
        archivos.add(administrador.darArchivos(tipos[1]));

        tipos[2] = AdministradorArchivos.AUDIO;
        archivos.add(administrador.darArchivos(tipos[2]));

        panelCompartidos.actualizarArbol(tipos, archivos);
    }

    public ArrayList<Archivo> darArchivosTipo(String valor) {
        return administrador.darArchivos(valor);
    }

    public void descargarArchivo(String nombre, String propietario) {
        int confirmacion = JOptionPane.showConfirmDialog(this, "¿Desea descargar el archivo " + nombre + " de " + propietario + "?", "Confirmación", JOptionPane.YES_NO_OPTION);
        if( confirmacion == JOptionPane.YES_OPTION){
            administrador.descargarArhivo(nombre, propietario);
        }
    }
}
